g_menu_append_section (combined, NULL, G_MENU_MODEL (window->priv->app_menu_section));
g_menu_append_section (combined, NULL, G_MENU_MODEL (window->priv->menubar_section));
- window->priv->menubar = gtk_model_menu_create_menu_bar (G_MENU_MODEL (combined), G_ACTION_OBSERVABLE (muxer));
+ window->priv->menubar = gtk_model_menu_create_menu_bar (G_MENU_MODEL (combined), G_ACTION_OBSERVABLE (muxer), window->priv->accels);
gtk_widget_set_parent (window->priv->menubar, GTK_WIDGET (window));
gtk_widget_show_all (window->priv->menubar);
g_object_unref (combined);
typedef struct {
GActionObservable *actions;
GMenuModel *model;
+ GtkAccelGroup *accels;
GtkMenuShell *shell;
guint update_idle;
GSList *connected;
{
GtkMenuItem *item;
- item = gtk_model_menu_item_new (model, item_index, binding->actions);
+ item = gtk_model_menu_item_new (model, item_index, binding->actions, binding->accels);
gtk_menu_shell_append (binding->shell, GTK_WIDGET (item));
gtk_widget_show (GTK_WIDGET (item));
binding->n_items++;
gtk_model_menu_bind (GtkMenuShell *shell,
GMenuModel *model,
GActionObservable *actions,
+ GtkAccelGroup *accels,
gboolean with_separators)
{
GtkModelMenuBinding *binding;
binding = g_slice_new (GtkModelMenuBinding);
binding->model = g_object_ref (model);
binding->actions = g_object_ref (actions);
+ binding->accels = accels;
binding->shell = shell;
binding->update_idle = 0;
binding->connected = NULL;
GtkWidget *
gtk_model_menu_create_menu (GMenuModel *model,
- GActionObservable *actions)
+ GActionObservable *actions,
+ GtkAccelGroup *accels)
{
GtkWidget *menu;
menu = gtk_menu_new ();
- gtk_model_menu_bind (GTK_MENU_SHELL (menu), model, actions, TRUE);
+ gtk_menu_set_accel_group (GTK_MENU (menu), accels);
+ gtk_model_menu_bind (GTK_MENU_SHELL (menu), model, actions, accels, TRUE);
return menu;
}
GtkWidget *
gtk_model_menu_create_menu_bar (GMenuModel *model,
- GActionObservable *actions)
+ GActionObservable *actions,
+ GtkAccelGroup *accels)
{
GtkWidget *menubar;
menubar = gtk_menu_bar_new ();
- gtk_model_menu_bind (GTK_MENU_SHELL (menubar), model, actions, FALSE);
+ gtk_model_menu_bind (GTK_MENU_SHELL (menubar), model, actions, accels, FALSE);
return menubar;
}
#include <gtk/gactionobservable.h>
#include <gtk/gtkmenushell.h>
+#include <gtk/gtkaccelgroup.h>
#include <gio/gio.h>
G_GNUC_INTERNAL
void gtk_model_menu_bind (GtkMenuShell *shell,
GMenuModel *model,
GActionObservable *actions,
+ GtkAccelGroup *accels,
gboolean with_separators);
G_GNUC_INTERNAL
GtkWidget * gtk_model_menu_create_menu_bar (GMenuModel *model,
- GActionObservable *actions);
+ GActionObservable *actions,
+ GtkAccelGroup *accels);
G_GNUC_INTERNAL
GtkWidget * gtk_model_menu_create_menu (GMenuModel *model,
- GActionObservable *actions);
+ GActionObservable *actions,
+ GtkAccelGroup *accels);
#endif /* __GTK_MODEL_MENU_H__ */
#include "gtkmodelmenuitem.h"
+#include "gtkaccelmap.h"
#include "gtkmodelmenu.h"
struct _GtkModelMenuItem
gtk_widget_queue_resize (GTK_WIDGET (item));
}
+static gchar *
+get_accel_path (const gchar *action_name,
+ GVariant *parameter)
+{
+ GString *s;
+
+ s = g_string_new ("<Actions>/");
+ g_string_append (s, action_name);
+ if (parameter)
+ {
+ g_string_append_c (s, '/');
+ g_variant_print_string (parameter, s, FALSE);
+ }
+ return g_string_free (s, FALSE);
+}
+
static void
gtk_model_menu_item_setup (GtkModelMenuItem *item,
GMenuModel *model,
gint item_index,
- GActionObservable *actions)
+ GActionObservable *actions,
+ GtkAccelGroup *accels)
{
GMenuAttributeIter *iter;
GMenuModel *submenu;
if ((submenu = g_menu_model_get_item_link (model, item_index, "submenu")))
{
- gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), gtk_model_menu_create_menu (submenu, actions));
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), gtk_model_menu_create_menu (submenu, actions, accels));
g_object_unref (submenu);
}
const GVariantType *type;
gboolean enabled;
GVariant *state;
+ gchar *path;
/* observer already causes us to hold a hard ref on the group */
item->actions = G_ACTION_GROUP (actions);
if (state != NULL)
g_variant_unref (state);
+
+ path = get_accel_path (item->action_name, item->target);
+ gtk_menu_item_set_accel_path (GTK_MENU_ITEM (item), path);
+ g_free (path);
}
}
GtkMenuItem *
gtk_model_menu_item_new (GMenuModel *model,
gint item_index,
- GActionObservable *actions)
+ GActionObservable *actions,
+ GtkAccelGroup *accels)
{
GtkModelMenuItem *item;
item = g_object_new (GTK_TYPE_MODEL_MENU_ITEM, NULL);
- gtk_model_menu_item_setup (item, model, item_index, actions);
+ gtk_model_menu_item_setup (item, model, item_index, actions, accels);
return GTK_MENU_ITEM (item);
}
G_GNUC_INTERNAL
GtkMenuItem * gtk_model_menu_item_new (GMenuModel *model,
gint item_index,
- GActionObservable *actions);
+ GActionObservable *actions,
+ GtkAccelGroup *accels);
#endif /* __GTK_MODEL_MENU_ITEM_H__ */